home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / PRUS101.ZIP / FTIMER.DOK < prev    next >
Text File  |  1994-12-08  |  19KB  |  448 lines

  1.  
  2.                   /////////////////////\\\\\\\\\\\\\\\\\\\\\\\
  3.                        Dokumentation zur FIDO Unit FTIMER
  4.                   \\\\\\\\\\\\\\\\\\\\\///////////////////////
  5.  
  6.                                  RELEASE 1.02
  7.                                  ^^^^^^^^^^^^
  8.  
  9.   =========================================================================
  10.   Autor: Peter Holschbach, 2:2450/660.3  @ FidoNet, Remscheid, 26.06.1994
  11.   =========================================================================
  12.  
  13.      1. Timer :
  14.      -----------
  15.  
  16.         Die Unit FTIMER.PAS stellt Funktionen und Prozeduren zur
  17.         Zeitmessung bis max. 24h zu Verfügung. Bis zu 10 unabhängige
  18.         Timer können mit dieser Unit verwaltet werden (Auflösung
  19.         ca. 55ms).
  20.         Zusätzlich könne 10 weitere Timer mit einer Auflösung von
  21.         einer Mikrosekunde und einer max. Laufzeit von 71 Minuten
  22.         verwaltet werden.
  23.         
  24.         Im Laufe der Zeit traten mit dieser Unit viele Probleme auf.
  25.         An dieser Stelle möchte ich kurz meine Erkenntnisse
  26.         zusammenstellen.
  27.         
  28.         1. Unter Windows kommen bei den schnellen Timer immer wieder
  29.            negative Zeiten heraus, weil scheinbar Interrupts
  30.            verlohren gehen.
  31.         2. Um kompatibel zu sein, habe ich bei den langsamen Timern
  32.            zum Lesen der Zeit die BIOS-Funktion 1AH verwendet.
  33.            Wenn man diese sehr oft aufruft, zählt der PC das
  34.            Datum nichtmehr weiter. Die Ursache ist mir z.Zt.
  35.            nicht klar. Die Unit kann durch den Compiler-Switch
  36.            "$DEFINE UseBios" auf diese Betriebsart umgestellt werden.
  37.            Ist "UseBios" abgeschaltet, wird direkt auf die
  38.            Daten des System-Tickers zugegriffen.
  39.  
  40.         Dies ist eine Low Level Unit.  Sie benötigt keinerlei Routinen
  41.         anderer  Units,  mit  Ausnahme  der in Turbo Pascals (6.0 oder
  42.         höher) Unit-Library TURBO.TPL enhaltenen Standard-Units.
  43.  
  44.  
  45.  
  46.      2. Kurzbeschreibung:
  47.      --------------------
  48.  
  49.         DeInstallFastTimer ... macht die Änderungen rückgängig, die
  50.                                an der Programmierung des Zählerbausteins
  51.                                vorgenommen werden mußte.
  52.         FreeFastHandles ...... zum internen Gebrauch der Unit. Flags zum
  53.                                Markieren eines belegten hochauflösenden Timers.
  54.         FreeHandles .......... zum internen Gebrauch der Unit. Flags zum
  55.                                Markieren eines belegten Timers.
  56.         GetFastTimerHandle ... wie GetTimerHandle für hochauflösende
  57.                                Timer.
  58.         GetTimerHandle ....... liefert die Nummer eines freien Handle
  59.                                zurück. Sind alle Handle Belegt, wird eine
  60.                                Null zurückgegeben. Der Timer ist bis zur
  61.                                Freigabe reserviert.
  62.         GetFastTimeSec ....... bibt die Zeit in Sekunden zurück, die seit
  63.                                dem Start des Timers vergangen ist.
  64.         GetTimeSec ........... gibt die Zeit in Sekunden zurück, die seit
  65.                                dem Start des Timers vergangen ist.
  66.         GetTimeTicks ......... gibt die Anzahl der Timerticks zurück, die
  67.                                seit dem Start des Timers mit StartTimer
  68.                                vergangen ist.
  69.         InstallFastTimer ..... Bereitet den Timerbaustein für die
  70.                                Zeitmessung vor und bestimmt die
  71.                                Verzugszeiten der Funktionen die zur
  72.                                Messung notwendig sind.
  73.         ReadFastTimer ........ gibt den aktuellen Wert des Timerbausteins
  74.                                sowie das LSB des Systemtickers zurück.
  75.                                Diese Funktion wird von anderen Funktionen
  76.                                verwendet.
  77.         StartFastTimer ....... startet die Zeitmessung eines hochauflösenden
  78.                                Timers.
  79.         StartTimer ........... startet die Zeitmessung eines Timers. Es
  80.                                wird nicht geprüft ob der Handle belegt ist.
  81.         StartFastTimeField ... zum internen Gebrauch der Unit. Enthält die
  82.                                Startzeiten aller hochauflösenden Timer.
  83.         StartTimeField ....... zum internen Gebrauch der Unit. Enthält die
  84.                                Startzeiten aller Timer.
  85.         StopTimer ............ der Timer wird angehalten. Eine Abfrage des
  86.                                Timers liefert jetzt immer den größtmöglichen
  87.                                Wert zurück.
  88.         TicksPerSecond ....... Anzahl der Systemticks pro Sekunde als REAL
  89.                                Konstante.
  90.         TimeAccessRec ........ Datenstruktur fü den internen Gebrauch.
  91.                                Ermöglicht den Zugriff auf einen LongInt Typ
  92.                                als LongInt und zwei Word Variablen.
  93.         TimerHandle .......... wird immer beim Aufruf von StartTimer auf
  94.                                die aktuelle Nummer des Handle gesetzt.
  95.         UnGetFastTimerHandle . wie "UnGetTimerHandle" für die
  96.                                hochauflösenden Timer.
  97.         UnGetTimerHandle ..... gibt den zum Handle korrospondierenden
  98.                                Timer wieder frei. War der Handle unbelegt,
  99.                                liefert die Funktion FALSE als Fehlermeldung
  100.                                zurück.
  101.  
  102.      3. Detaillierte Beschreibung:
  103.      -----------------------------
  104.      
  105.         ===============================================================
  106.         DeInstallFastTimer
  107.         ---------------------------------------------------------------
  108.         ERSTAUTOR    ...  Peter Holschbach, 2:2450/660.3 @ FidoNet
  109.  
  110.         ERSTDATUM    ...  17.11.1994    LETZTE ÄNDERUNG ...
  111.  
  112.         MODIFIKATION ...
  113.         ---------------------------------------------------------------
  114.  
  115.         BESCHREIBUNG ...  Der Timerbaustein wird wieder mit seinen
  116.                           Standardparametern programmiert
  117.  
  118.         DEKLARATION  ...  Procedure DeInstallFastTimer
  119.  
  120.         PARAMETER    ...  keine
  121.  
  122.         ERGEBNIS     ...  ein Zugriff auf hochauflösende Timer
  123.                           führt zu unsinnigen Werten.
  124.  
  125.         ===============================================================
  126.         GetFastTimerHandle
  127.         ---------------------------------------------------------------
  128.         ERSTAUTOR    ...  Peter Holschbach, 2:2450/660.3 @ FidoNet
  129.  
  130.         ERSTDATUM    ...  17.11.1994    LETZTE ÄNDERUNG ...
  131.  
  132.         MODIFIKATION ...
  133.         ---------------------------------------------------------------
  134.  
  135.         BESCHREIBUNG ...  belegt den nächsten freien Timer in der Liste
  136.                           der hochauflösenden Timer.
  137.  
  138.         DEKLARATION  ...  function GetFastTimerHandle : Word
  139.  
  140.         PARAMETER    ...  keine
  141.  
  142.         ERGEBNIS     ...  eine Variable des Typs WORD, die bei Werten
  143.                           größer Null die Nummer des Handle darstellt,
  144.                           bzw. bei Null eine Fehlermeldung (kein freier
  145.                           Timer vorhanden).
  146.  
  147.         ===============================================================
  148.         GetTimerHandle
  149.         ---------------------------------------------------------------
  150.         ERSTAUTOR    ...  Peter Holschbach, 2:2450/660.3 @ FidoNet
  151.  
  152.         ERSTDATUM    ...  26.06.1994    LETZTE ÄNDERUNG ...  26.06.1994
  153.  
  154.         MODIFIKATION ...
  155.         ---------------------------------------------------------------
  156.  
  157.         BESCHREIBUNG ...  belegt den nächsten freien Timer in der Liste.
  158.  
  159.         DEKLARATION  ...  function GetTimerHandle : Word
  160.  
  161.         PARAMETER    ...  keine
  162.  
  163.         ERGEBNIS     ...  eine Variable des Typs WORD, die bei Werten
  164.                           größer Null die Nummer des Handle darstellt,
  165.                           bzw. bei Null eine Fehlermeldung (kein freier
  166.                           Timer vorhanden).
  167.  
  168.         ===============================================================
  169.         GetTimerTicks
  170.         ---------------------------------------------------------------
  171.         ERSTAUTOR    ...  Peter Holschbach, 2:2450/660.3 @ FidoNet
  172.  
  173.         ERSTDATUM    ...  26.06.1994    LETZTE ÄNDERUNG ...  26.06.1994
  174.  
  175.         MODIFIKATION ...
  176.         ---------------------------------------------------------------
  177.  
  178.         BESCHREIBUNG ...   ermittelt die Laufzeit de Timers seit
  179.                            StartTimer
  180.  
  181.         DEKLARATION  ...   Function GetTimerTicks (Handle :Word):LongInt
  182.  
  183.         PARAMETER    ...   die Nummer des Handle, der mir GetTimerHandle
  184.                            reserviert wurde.
  185.  
  186.         ERGEBNIS     ...   die Zeit seit Start des Timers in Ticks
  187.                            (ca. 18,2 Ticks/sec)
  188.  
  189.  
  190.         ===============================================================
  191.         GetFastTimeSec
  192.         ---------------------------------------------------------------
  193.         ERSTAUTOR    ...  Peter Holschbach, 2:2450/660.3 @ FidoNet
  194.  
  195.         ERSTDATUM    ...  17.11.1994    LETZTE ÄNDERUNG ...
  196.  
  197.         MODIFIKATION ...
  198.         ---------------------------------------------------------------
  199.  
  200.         BESCHREIBUNG ...  ermittelt die Laufzeit des hochauflösenden
  201.                           Timers in Sekunden
  202.  
  203.         DEKLARATION  ...  Function GetFastTimerSec (Handle :Word):Real
  204.  
  205.         PARAMETER    ...  die Nummer des Handle, der mir GetTimerHandle
  206.                           reserviert wurde.
  207.  
  208.         ERGEBNIS     ...  die Laufzeit des Timers in Sekunden.
  209.  
  210.         ===============================================================
  211.         GetTimeSec
  212.         ---------------------------------------------------------------
  213.         ERSTAUTOR    ...  Peter Holschbach, 2:2450/660.3 @ FidoNet
  214.  
  215.         ERSTDATUM    ...  26.06.1994    LETZTE ÄNDERUNG ...  26.06.1994
  216.  
  217.         MODIFIKATION ...
  218.         ---------------------------------------------------------------
  219.  
  220.         BESCHREIBUNG ...  ermittelt die Laufzeit des Timers in Sekunden
  221.  
  222.         DEKLARATION  ...  Function GetTimerSec (Handle :Word):LongInt
  223.  
  224.         PARAMETER    ...  die Nummer des Handle, der mir GetTimerHandle
  225.                           reserviert wurde.
  226.  
  227.         ERGEBNIS     ...  die Laufzeit des Timers in Sekunden.
  228.  
  229.  
  230.         ===============================================================
  231.         InstallFastTimer
  232.         ---------------------------------------------------------------
  233.         ERSTAUTOR    ...  Peter Holschbach, 2:2450/660.3 @ FidoNet
  234.  
  235.         ERSTDATUM    ...  17.11.1994    LETZTE ÄNDERUNG ...
  236.  
  237.         MODIFIKATION ...
  238.         ---------------------------------------------------------------
  239.  
  240.         BESCHREIBUNG ...  Der Timerbaustein des PC wird umprogrammiert
  241.                           um Messungen mit Mikrosekundenauflösung
  242.                           zu erlauben. Die Uhr des PC wird hierdurch
  243.                           kaum (max. 65ms) beeinflußt.
  244.  
  245.         DEKLARATION  ...  Procedure InstallFastTimer
  246.  
  247.         PARAMETER    ...  -
  248.  
  249.         ERGEBNIS     ...  Alle Funktionen für hochauflösenden Timer
  250.                           können jetzt erst verwendet werden.
  251.  
  252.         ===============================================================
  253.         StartFastTimer
  254.         ---------------------------------------------------------------
  255.         ERSTAUTOR    ...  Peter Holschbach, 2:2450/660.3 @ FidoNet
  256.  
  257.         ERSTDATUM    ...  17.11.1994    LETZTE ÄNDERUNG ...
  258.  
  259.         MODIFIKATION ...
  260.         ---------------------------------------------------------------
  261.  
  262.         BESCHREIBUNG ...  der hochauflösende Timer wird gestartet und
  263.                           die aktuelle Nummer des Handle in
  264.                           FastTimerHandle abgelegt.
  265.  
  266.         DEKLARATION  ...  Procedure StartFastTimer (Handle : Word)
  267.  
  268.         PARAMETER    ...  die Nummer des Handle, der mir GetTimerHandle
  269.                           reserviert wurde.
  270.  
  271.         ERGEBNIS     ...  die Handlenummer in FastTimerHandle
  272.  
  273.         ===============================================================
  274.         StartTimer
  275.         ---------------------------------------------------------------
  276.         ERSTAUTOR    ...  Peter Holschbach, 2:2450/660.3 @ FidoNet
  277.  
  278.         ERSTDATUM    ...  26.06.1994    LETZTE ÄNDERUNG ...  26.06.1994
  279.  
  280.         MODIFIKATION ...
  281.         ---------------------------------------------------------------
  282.  
  283.         BESCHREIBUNG ...  der Timer wird gestartet und die aktuelle
  284.                           Nummer des Handle in TimerHandle abgelegt.
  285.                           Sonderfunktion bei einer ungültigen Handle-
  286.                           nummer (= 0) wird ein Handle über die
  287.                           Funktion GetHandle reserviert.
  288.  
  289.         DEKLARATION  ...  Procedure StartTimer (Handle : Word)
  290.  
  291.         PARAMETER    ...  die Nummer des Handle, der mir GetTimerHandle
  292.                           reserviert wurde. Oder 0 um einen Handle
  293.                           zu reservieren.
  294.  
  295.         ERGEBNIS     ...  die Handlenummer in TimerHandle
  296.  
  297.  
  298.  
  299.         ===============================================================
  300.         StopTimer
  301.         ---------------------------------------------------------------
  302.         ERSTAUTOR    ...  Peter Holschbach, 2:2450/660.3 @ FidoNet
  303.  
  304.         ERSTDATUM    ...  26.06.1994    LETZTE ÄNDERUNG ...  26.06.1994
  305.  
  306.         MODIFIKATION ...
  307.         ---------------------------------------------------------------
  308.  
  309.         BESCHREIBUNG ...  der Timer bekommt eine spezielle Kennung.
  310.                           Bei der Abfrage mit GetTimexxx wird immer
  311.                           der größten Wert zurückgeliefert
  312.  
  313.         DEKLARATION  ...  Procedure StopTimer (Handle : Word);
  314.  
  315.         PARAMETER    ...  die Nummer des Handle, der mir GetTimerHandle
  316.                           reserviert wurde.
  317.  
  318.         ERGEBNIS     ...  -
  319.  
  320.  
  321.         ===============================================================
  322.         UnGetFastTimerHandle
  323.         ---------------------------------------------------------------
  324.         ERSTAUTOR    ...  Peter Holschbach, 2:2450/660.3 @ FidoNet
  325.  
  326.         ERSTDATUM    ...  17.11.1994    LETZTE ÄNDERUNG ...
  327.  
  328.         MODIFIKATION ...
  329.         ---------------------------------------------------------------
  330.  
  331.         BESCHREIBUNG ...  gibt den Handle wider frei
  332.  
  333.         DEKLARATION  ...  function UnGetFastTimerHandle (Handle : Word)
  334.                                                          : Boolean
  335.  
  336.         PARAMETER    ...  die Nummer des Handle
  337.  
  338.         ERGEBNIS     ...  TRUE wenn der Handle belegt war.
  339.  
  340.         ===============================================================
  341.         UnGetTimerHandle
  342.         ---------------------------------------------------------------
  343.         ERSTAUTOR    ...  Peter Holschbach, 2:2450/660.3 @ FidoNet
  344.  
  345.         ERSTDATUM    ...  26.06.1994    LETZTE ÄNDERUNG ...  26.06.1994
  346.  
  347.         MODIFIKATION ...
  348.         ---------------------------------------------------------------
  349.  
  350.         BESCHREIBUNG ...  gibt den Handle wider frei
  351.  
  352.         DEKLARATION  ...  function UnGetTimerHandle (Handle : Word)
  353.                                                          : Boolean
  354.  
  355.         PARAMETER    ...  die Nummer des Handle
  356.  
  357.         ERGEBNIS     ...  TRUE wenn der Handle belegt war.
  358.  
  359.  
  360.  
  361.      4. Beispiele:
  362.      -------------
  363.  
  364.         ===============================================================
  365.         Gesamtbeispiel für Timer
  366.         ---------------------------------------------------------------
  367.  
  368.         Var   MyTimerHandle1,
  369.               MyTimerHandle2   : Word;
  370.  
  371.         Begin
  372.           MyTimerHandle1 := GetTimerHandle;
  373.           MyTimerHandle2 := GetTimerHandle;
  374.           If (MyTimerHandle1 = 0) OR (MyTimerHandle2 = 0) then Begin
  375.              Writeln ('Kein Timer mehr frei ! ');
  376.              Halt;
  377.           End;
  378.           StartTimer(MyTimerHandle1);
  379.           Delay (1000);
  380.           StartTimer (MyTimerHandle2);
  381.           Delay (1000);
  382.           Writeln (GetTimeSec (MyTimerHandle1));      {Ergebnis: 2 }
  383.           Delay (1000);
  384.           Writeln (GetTimeSec (MyTimerHandle2));      {Ergebnis: 2 }
  385.           If Not UnGetTimerHandle (MyTimerHandle1) OR
  386.              Not UnGetTimerHandle (MyTimerHandle2) Then Begin
  387.              Writeln ('Fehler bei der Freigabe !');
  388.           End;
  389.         End.
  390.  
  391.         ---------------------------------------------------------------
  392.  
  393.         Eine Vereinfachung für den Umgang mit nur einem Timer stellt
  394.         die Sonderfunktion von StartTimer dar, einen Handle reservieren
  395.         zu können:
  396.  
  397.         StartTimer (0);  {Handle reservieren u. Timer starten }
  398.         Delay (1000);
  399.         Writeln (GetTimeSec (TimerHandle));   {Ergebnis: 1}
  400.         UnGetTimerHandle (TimerHandle);
  401.  
  402.         ===============================================================
  403.         Kurzes Beispiel für die hochauflösenden Timer
  404.         ---------------------------------------------------------------
  405.         Var   MyTimerHandle1 : Word
  406.  
  407.  
  408.         Begin
  409.  
  410.           InstallFastTimer;
  411.           MyTimerHandle1 := GetFastTimerHandle;
  412.           If (MyTimerHandle1 = 0)  then Begin
  413.              Writeln ('Kein Timer mehr frei ! ');
  414.              Halt;
  415.           End;
  416.           StartFastTimer(MyTimerHandle1);
  417.           Delay (1);
  418.           Writeln (GetFastTimeSec (MyTimerHandle1));      {Ergebnis: 0.001 }
  419.           DeInstallFastTimer;
  420.         End.
  421.  
  422.         ---------------------------------------------------------------
  423.  
  424.       5. History:
  425.       -----------
  426.  
  427.         Neuerungen nach Release ...
  428.         ---------------------------
  429.            1.01
  430.            ----
  431.               - StartTimer mit erweitertet Funktionalität.
  432.  
  433.            1.02
  434.            ----
  435.               - Kosmetische Änderungen:
  436.                   - die Konstante "TicksPerSecond" ist global
  437.                     verfügbar
  438.               - Neu:
  439.                   - 10 Timer mit einer hohen Auflösung (1 Mikrosekunde)
  440.                     und maximal 71 Minuten Laufzeit können verwaltet
  441.                     werden.
  442.  
  443.   ==========================================================================
  444.  
  445.                   /////////////////////\\\\\\\\\\\\\\\\\\\\\\\
  446.                    Ende der Dokumentation zur FIDO Unit FTIMER
  447.                   \\\\\\\\\\\\\\\\\\\\\///////////////////////
  448.